package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import bean.ProfesorVO;
import bean.MateriaVO;
public class ProfesorDAO {

private static ProfesorDAO ins;
	
	private ProfesorDAO(){
		
	}
	
	public static ProfesorDAO getInstancia(){
		
		if(ins == null)
			ins = new ProfesorDAO();
		return ins;
		
	}
	
	public ProfesorVO obtener(ProfesorVO arg){
		
		ProfesorVO p = null;
		String sql = "Select * from Profesor Where legajo = ?";
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.prepareStatement(sql);
			stmt.setInt(1, arg.getNroLegajo());
			rs = stmt.executeQuery();
			if(rs.next()){
				p = new ProfesorVO();
				p.setNroLegajo(rs.getInt(1));
				p.setNombre(rs.getString(2));
				p.setDireccionVO(DireccionDAO.getInstancia().obtener(p));
				p.setMateriasVO(obtenerMaterias(p));
			}
			DataSource.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return p ;
		
	}
	
	
	public Vector<ProfesorVO> obtenerTodos(){
		
        Vector<ProfesorVO> profesores = new Vector<ProfesorVO>();
		String sql = "Select * from Profesor";
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(sql);
			while(rs.next()){
				ProfesorVO p = new ProfesorVO();
				p.setNroLegajo(rs.getInt(1));
				p.setNombre(rs.getString(2));
				p.setDireccionVO(DireccionDAO.getInstancia().obtener(p));
				p.setMateriasVO(obtenerMaterias(p));
				profesores.add(p);
			}
			DataSource.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return profesores;
		
	}
	
	
	public void guardar(ProfesorVO p){
		
		String sql = "Insert into Profesor values (?,?,?,?,?,?,?,?)";
		PreparedStatement stmt = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.prepareStatement(sql);
			stmt.setInt(1, p.getNroLegajo());
			stmt.setString(2,p.getNombre());
			stmt.setString(3, "");
			stmt.setInt(4, 0);
			stmt.setString(5, "");
			stmt.setString(6, "");
			stmt.setInt(7, 0);
			stmt.setString(8, "");
			stmt.execute();
			DataSource.close();
			DireccionDAO.getInstancia().guardar(p.getDireccionVO(), p);
			guardarMaterias(p.getMateriasVO(), p);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	
	public void actualizar(ProfesorVO p){
		
		String sql = "Update Profesor Set nombre = ? Where legajo =? ";
		PreparedStatement stmt = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.prepareStatement(sql);
			stmt.setString(1, p.getNombre());
			stmt.setInt(2, p.getNroLegajo());
			stmt.execute();
			DataSource.close();
			DireccionDAO.getInstancia().guardar(p.getDireccionVO(), p);
			actualizarMaterias(p.getMateriasVO(),p);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	public void eliminar(ProfesorVO p){
		
		String sql = "Delete Profesor Where legajo = ? ";
		PreparedStatement stmt = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.prepareStatement(sql);
			stmt.setInt(1, p.getNroLegajo());
			stmt.execute();
			DataSource.close();
			eliminarMaterias(p);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	
	/////////////////////////////////////  Materia_Profesor /////////////////////////////////////
	
	
	private void agregarMateria(MateriaVO m, ProfesorVO p){
		
		String sql = "Insert into Materia_Profesor values (?,?)";
		PreparedStatement stmt = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.prepareStatement(sql);
			stmt.setString(1, m.getNumero());
			stmt.setInt(2, p.getNroLegajo());
			stmt.execute();
			DataSource.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	
	private void guardarMaterias(Vector<MateriaVO> materias, ProfesorVO p){
		
		for(int i = 0; i<materias.size(); i++){
			MateriaVO m = materias.elementAt(i);
			agregarMateria(m,p);
		}
	}
	
	private void actualizarMaterias(Vector<MateriaVO > materias, ProfesorVO p){
		
		eliminarMaterias(p);
		for(int i = 0; i<materias.size(); i++){
			MateriaVO m = materias.elementAt(i);
			agregarMateria(m,p);
		}
	}
	
		
	/*	
	private void eliminarMateria(MateriaVO m, ProfesorVO p){
		
		String sql = "Delete Materia_Profesor Where nroMateria = ? and legProfesor = ?";
		PreparedStatement stmt = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.prepareStatement(sql);
			stmt.setString(1, m.getNumero());
			stmt.setInt(2, p.getNroLegajo());
			stmt.execute();
			DataSource.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	*/
	private Vector<MateriaVO> obtenerMaterias(ProfesorVO p){
		
	    Vector <MateriaVO> materias = new Vector <MateriaVO>();
		String sql = "Select * from Materia_Profesor Where legProfesor = ?";
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.prepareStatement(sql);
			stmt.setInt(1, p.getNroLegajo());
			rs = stmt.executeQuery();
			while(rs.next()){
				MateriaVO m = new MateriaVO();
				m.setNumero(rs.getString(1));
		        m = MateriaDAO.getInstancia().obtener(m);
		        materias.add(m);
			}
			DataSource.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return materias ;
		
	}
	
	private void eliminarMaterias(ProfesorVO p){
		
		String sql = "Delete Materia_Profesor Where legProfesor = ?";
		PreparedStatement stmt = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.prepareStatement(sql);
			stmt.setInt(1, p.getNroLegajo());
			stmt.execute();
			DataSource.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	
	public boolean existeProfesorConMateria(MateriaVO m ){
		boolean salida = false;
		String sql = "Select * from Materia_Profesor Where nroMateria = ? ";
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			Connection con = DataSource.getConexion();
			stmt = con.prepareStatement(sql);
			stmt.setString(1, m.getNumero());
			rs = stmt.executeQuery();
			if(rs.next()){
				salida = true;			
			}
			DataSource.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return salida;
	}	
	
	
}